<?php
/**
 * Author: LaiGuiming
 * Time: 2017-09-04 17:50
 * Copyright (C) 2016 Longyan Wehome Message CO.,LTD.
 */

namespace app\admin\logic;
use think\Db;

/**
 * 自动生成代码逻辑
 * Class TemplateLogic
 * @package app\admin\logic
 */
class TemplateLogic
{
    private $target_path;
    private $style;

    public function __construct()
    {
        $this->target_path=APP_PATH . DS . 'admin';
        $this->style="view1";
    }

    /**
     * 创建统计模型
     * @param $viewName
     * @param $url
     */
    function createReport($viewName,$url){
        $viewName=$viewName."View";
        //判断文件是否存在，存在则先删除
        $view_path=$this->target_path . '/view/report/' . $viewName . '.html';
        if(file_exists($view_path)){
            unlink($view_path);
        }

        //模板位置
        $path=APP_PATH . DS . '../public/template/'.$this->style.'/report/report.html';
        //1.得到控制器内容
        $content = file_get_contents($path);
        //2.替换控制器中的表名
        $content = str_replace('[URL]',$url, $content);
        //3.写入控制器
        $target = $this->target_path;
        if ((is_dir($target)
                || mkdir($target)) && (is_dir($target)
                || mkdir($target)) && (is_dir($target . '/view/report')
                || mkdir($target . '/view/report'))) {
            file_put_contents($view_path, $content);
        }
    }

    /**
     * 创建模型
     * @param $v
     */
    function createModel($v){
        //判断文件是否存在，存在则先删除
        $model_path=$this->target_path . '/model/' . $v['name'] . '.php';
        if(file_exists($model_path)){
            unlink($model_path);
        }
        //遍历字段
        $table_info=$this->getTableInfo($v);
        //模型扩展字段
        $append_field="";
        //模型扩展字段方法
        $append_fun="";
        //修改时间自动注入方法
        $mt_flag=false;
        foreach ($table_info as $item) {
            //模型扩展字段
            $append_field .=$this->getAppendField($item);
            //模型扩展字段方法
            $append_fun .=$this->getAppendFun($item);

            $cn = $item['COLUMN_NAME'];
            if($cn == "mt"){
                $mt_flag=true;
            }
        }
        //去除末尾逗号
        if(strrpos($append_field,",\r\n")!=false){
            $append_field=substr($append_field,0,strrpos($append_field,",\r\n"));
        }

        //模板位置
        $path=APP_PATH . DS . '../public/template/'.$this->style.'/model/Base.php';
        //1.得到基础模型内容
        $content = file_get_contents($path);
        //2.替换模型名称
        $content = str_replace('[ModelName]', $v['name'], $content);
        //3.替换注释
        $content = str_replace('[comment]', $v['comment'], $content);
        //4.替换时间
        $content = str_replace('[time]', date("Y-m-d H:i:s"), $content);
        //5.替换扩展字段
        $content = str_replace('[AppendField]', $append_field, $content);
        //6.替换扩展方法
        $content = str_replace('[AppendFun]', $append_fun, $content);
        //7.添加修改时间自动写入方法
        //7.1.取内容
        if($mt_flag){
            $path=APP_PATH . DS . '../public/template/'.$this->style.'/model/MtFun.tpl';
            $mt_fun = file_get_contents($path);
            $mt_field=",'mt'";
        }else{
            $mt_fun="";
            $mt_field="";
        }
        //7.2.替换数据
        $content = str_replace('[MtFun]', $mt_fun, $content);
        $content = str_replace('[MtField]', $mt_field, $content);

        //1.写入模型
        $target=$this->target_path;
        if ((is_dir($target)
                || mkdir($target)) && (is_dir($target)
                || mkdir($target)) && (is_dir($target . '/model')
                || mkdir($target . '/model'))) {
            file_put_contents($model_path, $content);
        }
    }

    /**
     * 创建控制器
     * @param $v
     */
    function createController($v){
        //判断文件是否存在，存在则先删除
        $ctl_path=$this->target_path . '/controller/' . $v['name'] . '.php';
        if(file_exists($ctl_path)){
            unlink($ctl_path);
        }

        //模板位置
        $path=APP_PATH . DS . '../public/template/'.$this->style.'/controller/Base.php';
        //1.得到控制器内容
        $content = file_get_contents($path);
        //2.替换控制器中的表名
        $content = str_replace('[table_name]', $v['name'], $content);
        //3.替换控制器中ModelName
        $content = str_replace('[ModelName]', $v['_name'], $content);
        //4.替换控制器中注释
        $content = str_replace('[comment]', $v['comment'], $content);
        //5.替换时间
        $content = str_replace('[time]', date("Y-m-d H:i:s"), $content);
        //6.写入控制器
        $target = $this->target_path;
        if ((is_dir($target)
                || mkdir($target)) && (is_dir($target)
                || mkdir($target)) && (is_dir($target . '/controller')
                || mkdir($target . '/controller'))) {
            file_put_contents($ctl_path, $content);
        }
    }

    /**
     * 创建验证器
     * @param $v
     */
    function createValidate($v){
        //判断文件是否存在，存在则先删除
        $validate_path=$this->target_path . '/validate/' . $v['name'] . '.php';
        if(file_exists($validate_path)){
            unlink($validate_path);
        }

        //遍历字段
        $table_info=$this->getTableInfo($v);
        //验证规则
        $rule_data="";
        foreach ($table_info as $item) {
            //验证规则
            $rule_data= $rule_data.$this->getRuleData($item);
        }
        //去除末尾逗号
        if(strrpos($rule_data,",\r\n")!=false){
            $rule_data=substr($rule_data,0,strrpos($rule_data,",\r\n"));
        }

        //模板位置
        $path=APP_PATH . DS . '../public/template/'.$this->style.'/validate/Base.php';
        //1.得到基础模型内容
        $content = file_get_contents($path);
        //2.替换模型名称
        $content = str_replace('[ModelName]', $v['name'], $content);
        //3.替换注释
        $content = str_replace('[comment]', $v['comment'], $content);
        //4.替换时间
        $content = str_replace('[time]', date("Y-m-d H:i:s"), $content);
        //5.替换扩展字段
        $content = str_replace('[RuleData]', $rule_data, $content);

        //6.写入模型
        $target=$this->target_path;
        if ((is_dir($target)
                || mkdir($target)) && (is_dir($target)
                || mkdir($target)) && (is_dir($target . '/validate')
                || mkdir($target . '/validate'))) {
            file_put_contents($validate_path, $content);
        }
    }

    /**
     * 创建index页面
     * @param $v
     */
    function createIndexView($v){
        //判断文件是否存在，存在则先删除
        $index_path=$this->target_path . '/view/' . $v['_name'] . '/index.html';
        if(file_exists($index_path)){
            unlink($index_path);
        }
        $target=$this->target_path;

        //模板位置
        $path=APP_PATH . DS . '../public/template/'.$this->style.'/view/index.html';

        //遍历字段
        $table_info=$this->getTableInfo($v);
        //表列
        $table_data = "";
        foreach ($table_info as $item) {
            //表格列内容
            $table_data .= $this->getTableField($item);
        }
        //去除末尾逗号
        if(strrpos($table_data,"\r\n")!=false){
            $table_data=substr($table_data,0,strrpos($table_data,"\r\n"));
        }
        //1.得到基础index内容
        $content = file_get_contents($path);
        //2.替换表名
        $content = str_replace('[table_name]',$v['_name'], $content);
        //3.替换列数据
        $content = str_replace('[table_data]', $table_data, $content);

        $view_path=$target . '/view';
        if ((is_dir($view_path)
                || mkdir($view_path)) && (is_dir($view_path)
                || mkdir($view_path)) && (is_dir($view_path .'/'.$v['_name'])
                || mkdir($view_path .'/'.$v['_name']))) {
            file_put_contents($index_path, $content);
        }
    }

    /**
     * 创建add页面
     * @param $v
     */
    function createAddView($v){
        //判断文件是否存在，存在则先删除
        $add_path=$this->target_path . '/view/' . $v['_name'] . '/add.html';
        if(file_exists($add_path)){
            unlink($add_path);
        }
        $target=$this->target_path;

        //模板位置
        $path=APP_PATH . DS . '../public/template/'.$this->style.'/view/add.html';

        //遍历字段
        $table_info=$this->getTableInfo($v);
        //表单列
        $form_data = "";
        //百度编辑器初始化
        $ueditor_data="";
        //图片上传初始化
        $image_data="";
        foreach ($table_info as $item) {
            //add 表单字段数据
            $form_data = $form_data . $this->getFormField($item);
            $cn = $item['COLUMN_NAME'];
            if(strpos($cn,'_img')!== false){
                //图片上传
                $image_data.="        initFileInput('".$cn."');\r\n";
            }else if(strpos($cn,'_txt')!== false){
                //百度编辑器
                $ueditor_data.="        UE.getEditor('".$cn."');\r\n";
            }
        }

        //1.得到基础add内容
        $content = file_get_contents($path);
        //2.替换表单列
        $content = str_replace('[form_data]', $form_data, $content);
        //3.替换百度编辑器初始数据
        $content = str_replace('[UeditorData]', $ueditor_data, $content);
        //4.替换图片上传初始数据
        $content = str_replace('[ImageData]', $image_data, $content);

        $view_path=$target . '/view';
        if ((is_dir($view_path)
                || mkdir($view_path)) && (is_dir($view_path)
                || mkdir($view_path)) && (is_dir($view_path .'/'.$v['_name'])
                || mkdir($view_path .'/'.$v['_name']))) {
            file_put_contents($add_path, $content);
        }
    }

    /**
     * 获取数据库表信息
     * @param $v
     * @return mixed
     */
    function getTableInfo($v){
        //获取数据表信息
        $table_name = $v['prefix'] . $v['_name'];
        $sql = "select COLUMN_COMMENT,IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,COLUMN_NAME from information_schema.COLUMNS where table_name = '"
            . $table_name . "' and TABLE_SCHEMA='" . config('database.database') . "'";
        $table_info = Db::connect(config('database'))->query($sql);
        return $table_info;
    }

    /**
     * 获得校验规则数据
     * @param $item
     * @return string
     */
    public function getRuleData($item){
        $res="";
        $cn = $item['COLUMN_NAME'];//字段名
        $ct = $item['DATA_TYPE'];//字段类型
        $cc = $item['COLUMN_COMMENT'];
        $isnull=$item['IS_NULLABLE'];
        //不处理的字段
        if ($cn == "id" || $cn == "ct" || $cn == "mt" || $cn == "status") {
            return "";
        }
        if($ct=="enum"){
            //字段切割
            $cc= explode(':',$cc);
            $cc= $cc[0];
        }

        if ($isnull == "NO") {
            $res="      ['".$cn."','require','".$cc."必须填写'],\r\n";
        }

        return $res;
    }

    /**
     * 获得add表单数据
     * @param $item
     * @return string
     */
    public function getFormField($item){
        $cn = $item['COLUMN_NAME'];
        $cc = $item['COLUMN_COMMENT'];
        $ct = $item['DATA_TYPE'];
        if($ct=="enum"){
            //字段切割
            $cc= explode(':',$cc);
            $cc= $cc[0];
        }

        //不处理的字段
        if ($cn == "id" || $cn == "ct" || $cn == "mt" || $cn == "status") {
            return "";
        }

        //TODO 下拉框

        //复选框

        //单选

        if($ct=="int" || $ct=="decimal"){
            //数字框
            $fieldData='<input type="number" class="form-control" name="' . $cn . '" value="{$data[\'' . $cn . '\']}" >';
        }else if(strpos($cn,'_img')!== false){
            //图片上传
            $fieldData='<input id="' . $cn . '" type="file">
                        <input id="' . $cn . '_previewImg"  type="hidden" name="' . $cn . '" value="{$data[\'' . $cn . '\']}">';
        }else if(strpos($cn,'_txt')!== false){
            //百度编辑器
            $fieldData='<script  id="' . $cn . '" name="' . $cn . '" type="text/plain" >{$data[\'' . $cn . '\']}</script>';
        }else if(strpos($cn,'_time')!== false){
            //时间格式
            $fieldData='<div class="input-group date">
                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
                            <input type="text" name="' . $cn . '" class="form-control" value="{$data[\'' . $cn . '\']}" readonly>
                        </div>';
        }else if($ct=="enum"){
            $cc1 = $item['COLUMN_COMMENT'];
            $cc1= explode(':',$cc1);
            $cc1= $cc1[1];
            //获取数据
            //0=待审核,1=审核通过,2=审核不通过
            $a1=explode(',',$cc1);
            $fieldData='<select class="form-control" name="' . $cn . '">'."\r\n";
            foreach ($a1 as $temp){
                $a2=explode('=',$temp);
                $fieldData.='                           <option value="'.$a2[0].'" {if condition="$data[\'' . $cn . '\']=='.$a2[0].'"}selected{/if}>'.$a2[1].'</option>'."\r\n";
            }
            $fieldData.='                        </select>';
        }else{
            //文本框
            $fieldData='<input type="text" class="form-control" name="' . $cn . '" value="{$data[\'' . $cn . '\']}" >';
        }

        $fd = '
                <div class="form-group">
                    <label class="col-sm-2 control-label">'. $cc . '</label>
                    <div class="col-sm-10">
                        '.$fieldData .'
                    </div>
                </div>
                <div class="hr-line-dashed"></div>';
        return $fd;
    }

    /**
     * 获得模型扩展方法
     * @param $item
     * @return mixed|string
     */
    public function getAppendFun($item){
        $res="";
        $cn = $item['COLUMN_NAME'];//字段名
        $cc = $item['COLUMN_COMMENT'];//字段注释
        $ct = $item['DATA_TYPE'];//字段类型

        if($ct=="enum"){
            $cc= explode(':',$cc);
            $cc= $cc[1];
            //获取数据
            //0=待审核,1=审核通过,2=审核不通过
            //['0' => '未知','1' => '女','2' => '男']
            $a1=explode(',',$cc);
            $data="[";
            foreach ($a1 as $temp){
                $a2=explode('=',$temp);
                $data.="'".$a2[0]."'=>'".$a2[1]."',";
            }
            if($data!="["){
                $data=substr($data,0,strlen($data)-1);
            }
            $data.="]";
            //1.取内容
            $path=APP_PATH . DS . '../public/template/'.$this->style.'/model/TextAttr.tpl';
            $content = file_get_contents($path);
            //2.替换类型数据
            $content = str_replace('[TypeData]', $data, $content);
            //3.替换字段名
            $content = str_replace('[FieldName]', $cn, $content);
            //4.替换方法
            $fun_name="get".convertUnderline($cn)."TextAttr";
            $content = str_replace('[FunName]', $fun_name, $content);
            $res=$content;
        }
        return $res;
    }

    /**
     * 获得模型扩展字段
     * @param $item
     * @return string
     */
    public function getAppendField($item){
        $res="";
        $cn = $item['COLUMN_NAME'];//字段名
        $ct = $item['DATA_TYPE'];//字段类型

        if($ct=="enum"){
            $res="       '".$cn."_text"."',\r\n";
        }
        return $res;
    }

    /**
     * 获得index列表字段
     * @param $item
     * @return string
     */
    public function getTableField($item){
        $res="";
        $cn = $item['COLUMN_NAME'];//字段名
        $cc = $item['COLUMN_COMMENT'];//字段注释
        $ct = $item['DATA_TYPE'];//字段类型

        //表格不显示字段
        if ($cn == "id"  || $cn == "mt" || $cn == "status") {
            return $res;
        }

        //默认创建时间
        if($cn == "ct"){
            $cc = "创建时间";//字段注释
        }

        //图片
        if(strpos($cn,'_img')!== false){
            $res = "            {title: '".$cc."', field: '".$cn."',formatter:function(v){return getImgField(v)}},\r\n";
        }else if($ct=="enum"){
            //字段切割
            $cc= explode(':',$cc);
            $cc= $cc[0];
            $res = "            {title: '".$cc."', field: '".$cn."_text'},\r\n";
        }else{
            $res = "            {title: '".$cc."', field: '".$cn."'},\r\n";
        }
        return $res;
    }

}